package cn.ahaiahaixx.dp.abstractFactory;

/**
 * 工厂管理（工厂方法设计模式）
 * 
 * @author Aiden Pearce
 *
 */
public class FactoryManager {
  public static Factory getFactory(String type) {
    if ("microsoft".equalsIgnoreCase(type)) {
      return new Microsoft();
    } else if ("sony".equalsIgnoreCase(type)) {
      return new Sony();
    }
    throw new RuntimeException("没有对应的厂商");
  }
  
  /**
   * 静态的反射工厂(反射工厂是工厂模式的特殊版本，充分利用了java反射api达到更灵活更安全的产生对象)
   * 反射定义是程序在运行时可以自省状态和属性
   * 第一个问题，怎么限定T只能是factory的子类
   * 第二个问题，怎么创建指定class的对象实例
   */
  
  /**
   * 泛型反射工厂，只需传入Factory或者Factory子类的类型，创建对应的实例
   * @param c
   * @return Factory的实例
   */
  public static <T extends Factory> T getFactory(Class<T> c) {
    try {
      //class.newInstance()方法表示创建class对应实例
      return c.newInstance();
    } catch (Exception e) {
      return null;
    }
  }
  
}
